<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
namespace Agp\CoreBundle\Manager;

use Agp\CoreBundle\Manager\BaseManager;
use Agp\CoreBundle\Entity\Boleto;
use Agp\CoreBundle\Entity\CobrancaContrato;
use Agp\CoreBundle\Entity\Contrato;
use Agp\CoreBundle\Entity\ConfigBoleto;
use Agp\CoreBundle\Entity\VendaAgape;

/**
 * Description of CobrancaContratoManager
 *
 * @author bondcs
 */
class CobrancaContratoManager extends BaseManager
{
    public function persist($entity) {
        $entity->setTipo(CobrancaContrato::TP_COBRANCA);
        $entity->setDtReferencia($entity->getDtVencimento());
        $this->gerarBoleto($entity);
        parent::persist($entity); 
    }
    
    public function update($entity) {
        
        if ($entity->getSituacao() == CobrancaContrato::COB_CANCELADO){
            foreach ($entity->getVendas() as $venda){
                if ($venda->getCobrancas()->count() <= 1){
                    $this->container->get('agp.vendaAgape.manager')->updateSituacao($venda);
                }
            }
        }
        
        parent::update($entity);
    }

        // ATENCAO FUÇÃO UTILIZADA SOMENTE NA GERAR COBRANÇAS DETRO DE DA JANELA DE COBRANAS
    public function geraCobrancas($data, $contrato)
    {
        //$parcela = substr(str_replace(",", ".", $data['vlrParcela']),3) / $data['nmParcela'];
        if ($data['clear'] == true){
            $this->container->get('agp.cobrancaContrato.repository')->deleteByContrato($contrato);
        }
        for($i = 1; $i <= $data['nmParcela']; $i++){
            $cobranca = $this->create();
            $cobranca->setVlrParcela($data['vlrParcela']);
            if ($i == 1){
               $cobranca->setDtVencimento($data['dtInicio']); 
            }else{
                switch ($contrato->getPeriodo()){
                    case 'diario':
                        $cobranca->setDtVencimento($data['dtInicio']->add(new \DateInterval("P1D")));
                        break;
                    case 'mensal':
                        $cobranca->setDtVencimento($data['dtInicio']->add(new \DateInterval("P1M")));
                        break;
                    case 'anual':
                        $cobranca->setDtVencimento($data['dtInicio']->add(new \DateInterval("P1Y")));
                        break;
                }
            }
            
            $cobranca->setTipo(CobrancaContrato::TP_COBRANCA);
            $cobranca->setDtReferencia($cobranca->getDtVencimento());
            $cobranca->setContrato($contrato);
            $this->persist($cobranca);
            
        }
        
    }
    
    public function gerarBoleto($cobranca)
    {
        if ($cobranca->getTipo() == CobrancaContrato::TP_COBRANCA){
            $config = $this->container->get('agp.configBoleto.repository')->findOneBy(array('tipo' => ConfigBoleto::TP_COBRANCA));
        }
        
        if ($cobranca->getTipo() == CobrancaContrato::TP_VENDA){
            $config = $this->container->get('agp.configBoleto.repository')->findOneBy(array('tipo' => ConfigBoleto::TP_VENDA));
        }
        
        $boleto = new \Agp\CoreBundle\Entity\Boleto;
        $boleto->setConfigBoleto($config);
        $cobranca->setBoleto($boleto);
        
        $this->em->persist($boleto);
        $this->em->flush();
        
    }
    
    public function baixaCobranca($entity, $envio){
        $terminalEmpresaManager = $this->container->get('agp.terminalEmpresa.manager');
        // Bloqueio no dia 05 do proximo mês ao mês de vencimento
        $dtReferencia = clone $entity->getDtReferencia();
        
        // ROTINA PARA ATUALIZAR LIBERAÇAO DOS TERMINAIS
        if ($entity->getTipo() == CobrancaContrato::TP_COBRANCA)
        {
            if ($entity->getContrato()->getPeriodo() == Contrato::PE_MENSAL){
                $mesSeguinte = $dtReferencia ->modify('+2 month')->format('m');
                $ano = $dtReferencia ->modify('+2 month')->format('Y');
                $dtReferenciaFinal = new \DateTime('05-'.$mesSeguinte.'-'.$ano);

            }elseif ($entity->getContrato()->getPeriodo() == Contrato::PE_ANUAL){
                $dtReferenciaFinal = $dtReferencia->modify('+1 year');
            }
            
            if ($entity->getContrato()->getPeriodo() != Contrato::PE_DIARIO && $entity->getContrato()->getLiberacaoAutomatica() == true){
                
                $libs = array();
                $terminais = $this->container->get("agp.terminalEmpresa.repository")->getTerminaisByEmpresa($entity->getContrato()->getEmpresa());
                foreach ($terminais as $terminalEmpresa){
                    $terminalEmpresaManager->updateLiberacao($terminalEmpresa, $dtReferenciaFinal);
                    $libs[$terminalEmpresa->getTerminal()->getCodTerminal()] = $terminalEmpresa->getLiberacaoFormatado();
                }
            }
            
            if ($envio){
                $this->container->get('agp.email')->enviarNotificacaoLiberacao($entity, $libs);
                $this->container->get('agp.sms')->enviarLiberacao($libs, $entity->getContrato()->getEmpresa());
            }
        
        }else{
            if ($envio){
                $this->container->get('agp.email')->enviarNotificacao($entity);
            }
        }
//        // CRIA NOVA PARCELA QUANDO BAIXAR ÚLTIMA PARCELA
//        if ($entity->getContrato()->getLastCodCobranca() == $entity->getCodCobrancaContrato()){
//            if ($entity->getContrato()->getPeriodo() != Contrato::PE_DIARIO && $entity->getTipo() == CobrancaContrato::TP_COBRANCA){ 
//                $cobranca = new CobrancaContrato;
//                $cobranca->setTipo(CobrancaContrato::TP_COBRANCA);
//                $cobranca->setVlrParcelaFloat($entity->getVlrParcela());
//                
//                $dtReferencia = clone $entity->getDtReferencia();
//                if ($entity->getContrato()->getPeriodo() == Contrato::PE_MENSAL){
//                    $cobranca->setDtVencimento($dtReferencia->modify('+1 month'));
//                }elseif ($entity->getContrato()->getPeriodo() == Contrato::PE_ANUAL){
//                    $cobranca->setDtVencimento($dtReferencia->modify('+1 year'));
//                }
//
//                $cobranca->setDtReferencia($cobranca->getDtVencimento());
//                $cobranca->setContrato($entity->getContrato());
//
//                $this->persist($cobranca);
//            }
//        }
//        
//        foreach ($entity->getVendas() as $venda){
//            if ($venda->getLastCodCobranca() == $entity->getCodCobrancaContrato()){
//                $venda->setSituacao(VendaAgape::SIT_PAGO);
//            }
//        }
 
        $entity->setSituacao(CobrancaContrato::COB_BAIXADO);
        $this->update($entity);
        
    }
    
    public function retornoCobranca($retornos){
        $emailsRetorno = array();
        
        foreach ($retornos as $retorno){
            $dados = explode('*', $retorno);

            $cobranca = $this->container->get('agp.cobrancaContrato.manager')->findById($dados[0]);
            if ($cobranca != null){
                //var_dump($retorno['valor_recebido']);
                $cobranca->setVlrPagoFromRetorno($dados[1]);
                $cobranca->setDtPgto(new \DateTime($dados[2]));
                
                if($cobranca->getVlrPago() >= $cobranca->getValorTotal() && $cobranca->getSituacao() != CobrancaContrato::COB_BAIXADO){
                     $emailsRetorno[] = 'Empresa: '.$cobranca->getContrato()->getEmpresa()->getRazaoSocial().' - Cobrança: '. $cobranca->getCodCobrancaContrato().' - Valor recebido: '. $cobranca->getVlrPago();
                     $this->baixaCobranca($cobranca, true);
                }
            }
        }
        
        if ($emailsRetorno != array()){
            $this->container->get('agp.email')->enviarRetornoEmail($emailsRetorno);
        }
        
    }
    
    public function remove($entity) {
        if ($entity->getVendas()->isEmpty()){
            parent::remove($entity);
        }else{
            throw new \Symfony\Component\Security\Core\Exception\AccessDeniedException;
        }
    }
}

?>
